﻿using GameTools.Data.ConfigData;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GameTools.Service.ConfigServer
{
    public class ConfigService : IConfigService
    {
        private readonly string _userConfigDirectory;

        public ConfigService()
        {
            _userConfigDirectory = Path.Combine(
                Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
                "GameTools", // 可替换成你的程序名称
                "Configs");

            if (!Directory.Exists(_userConfigDirectory))
            {
                Directory.CreateDirectory(_userConfigDirectory);
            }
        }

        public T LoadConfig<T>(string fileName) where T : class, new()
        {
            string targetPath = Path.Combine(_userConfigDirectory, fileName);
            string installPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Assets", "Configs", fileName);

            // 如果目标文件不存在，或者目标文件的最后修改时间早于安装目录中的文件
            if (!File.Exists(targetPath) || File.GetLastWriteTime(targetPath) < File.GetLastWriteTime(installPath))
            {
                // 如果目标目录存在并且文件可以找到，就从资源目录复制最新的文件
                if (File.Exists(installPath))
                {
                    // 删除旧的文件，防止覆盖旧内容
                    File.Copy(installPath, targetPath, true);
                }
                else
                {
                    // 如果没有文件，则创建一个新的默认配置文件
                    SaveConfig(fileName, new T());
                }
            }

            try
            {
                // 读取配置文件内容
                string json = File.ReadAllText(targetPath);
                return JsonConvert.DeserializeObject<T>(json) ?? new T();
            }
            catch
            {
                return new T();
            }
        }


        public void SaveConfig<T>(string fileName, T config) where T : class
        {
            string path = Path.Combine(_userConfigDirectory, fileName);
            string json = JsonConvert.SerializeObject(config, Formatting.Indented);
            File.WriteAllText(path, json);
        }

        public string ImportConfigFromFile(string sourceFilePath, string targetFileName)
        {
            if (!File.Exists(sourceFilePath))
                throw new FileNotFoundException("源文件不存在", sourceFilePath);

            string targetPath = Path.Combine(_userConfigDirectory, targetFileName);

            File.Copy(sourceFilePath, targetPath, overwrite: true);

            return targetPath;
        }



        public async Task<T> LoadConfigAsync<T>(string fileName) where T : class, new()
        {
            string targetPath = Path.Combine(_userConfigDirectory, fileName);
            string installPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Assets", "Configs", fileName);

            // 如果目标文件不存在，或者目标文件的最后修改时间早于安装目录中的文件
            if (!File.Exists(targetPath) || File.GetLastWriteTime(targetPath) < File.GetLastWriteTime(installPath))
            {
                // 如果目标目录存在并且文件可以找到，就从资源目录复制最新的文件
                if (File.Exists(installPath))
                {
                    // 删除旧的文件，防止覆盖旧内容
                    File.Copy(installPath, targetPath, true);
                }
                else
                {
                    // 如果没有文件，则创建一个新的默认配置文件
                    await SaveConfigAsync(fileName, new T());
                }
            }

            try
            {
                // 异步读取配置文件内容
                string json = await File.ReadAllTextAsync(targetPath);
                return JsonConvert.DeserializeObject<T>(json) ?? new T();
            }
            catch
            {
                return new T();
            }
        }


        public async Task SaveConfigAsync<T>(string fileName, T config) where T : class
        {
            string path = Path.Combine(_userConfigDirectory, fileName);
            string json = JsonConvert.SerializeObject(config, Formatting.Indented);
            await File.WriteAllTextAsync(path, json);
        }

        public async Task ImportConfigFromFileAsync(string sourcePath, string targetFileName)
        {
            if (string.IsNullOrWhiteSpace(sourcePath) || !File.Exists(sourcePath))
                return;

            string targetPath = Path.Combine(_userConfigDirectory, targetFileName);

            await using var sourceStream = File.OpenRead(sourcePath);
            await using var targetStream = File.Create(targetPath);
            await sourceStream.CopyToAsync(targetStream);
        }

        // 在 IConfigService 接口添加
        public async Task<JObject> ImportAndLoadConfigAsync(string sourcePath, string targetFileName)
        {
            await ImportConfigFromFileAsync(sourcePath, targetFileName);
            return LoadConfig<JObject>(targetFileName);
        }

    }

}
